package cl.solidit.geomanagement.web.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import cl.solidit.geomanagement.persistance.ComunaDAO;
import cl.solidit.geomanagement.persistance.PersonaDAO;
import cl.solidit.geomanagement.persistance.model.Comuna;
import cl.solidit.geomanagement.persistance.model.Persona;
import cl.solidit.geomanagement.persistance.model.Rol;
import cl.solidit.geomanagement.persistance.model.Usuario;
import cl.solidit.geomanagement.web.service.RegisterPersonsService;

@Controller
public class RegisterPersonController {
	@Autowired
	private PersonaDAO personaDAO;
	@Autowired
	private ComunaDAO comundaDAO;
	@Autowired 
	private RegisterPersonsService registerPersonstService;
	@Autowired
	private ComunaDAO comunaDAO;
	
	
	@RequestMapping(value = "/registrar_comprador", method = RequestMethod.POST)
	public ModelAndView registrarCompradorPost(@ModelAttribute("command") Persona persona,
			ModelMap modelo) {
		registerPersonstService.registrarPersona(persona);
		return new ModelAndView("cliente_registrado");
	}

	@RequestMapping(value = "/registrar_comprador", method = RequestMethod.GET)
	public ModelAndView registrarCompradorGet() {

		List<Comuna> listaComunas = comundaDAO.traerComuna();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaComunas", listaComunas);
		Persona p = new Persona();
		p.setComuna(new Comuna());
		map.put("command", p);
		return new ModelAndView("registrar_comprador", map);

	}
	
	@RequestMapping(value = "/registrar_usuario", method = RequestMethod.GET)
	public ModelAndView acceso(HttpServletRequest request) {
		List<Comuna> listaComunas = comunaDAO.traerComuna();
		List<Rol> listaRol = personaDAO.traerRol();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaRol", listaRol);
		map.put("listaComunas", listaComunas);
		Persona p = new Persona();
		p.setComuna(new Comuna());
		p.setUsuario(new Usuario());
		map.put("command", p);
		return new ModelAndView("registrar_usuario", map);
	}
	
	@Transactional
	@RequestMapping(value = "/registrar_usuario", method = RequestMethod.POST)
	public ModelAndView addPersona(@ModelAttribute("command") Persona persona,
			HttpServletRequest request) {
		registerPersonstService.registrarUsuario(persona, request);
		return new ModelAndView("usuario_registrado");
	}
	@Transactional
	@RequestMapping(value = "/actualizar_datos_usuario", method = RequestMethod.GET)
	public ModelAndView access(HttpServletRequest request) {
		Persona persona = personaDAO.findByRut((String) request
				.getSession().getAttribute("rut"));
//		persona.getUsuario().getRol().setId((Long) request.getSession().getAttribute("rol"));
		List<Comuna> listaComunas = comunaDAO.traerComuna();
		List<Rol> listaRol = personaDAO.traerRol();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("listaRol", listaRol);
		map.put("listaComunas", listaComunas);
		//persona.setComuna(new Comuna());
		Hibernate.initialize(persona.getComuna());
		map.put("command", persona);
		return new ModelAndView("actualizar_datos_usuario", map);

	}

	@Transactional
	@RequestMapping(value = "/actualizar_datos_usuario", method = RequestMethod.POST)
	public ModelAndView updateUser(@ModelAttribute("command") Persona persona,
			HttpServletRequest request) {
//		if(persona.getUsuario()== null)
//			persona.setUsuario(request.getSession().getAttribute("id"));
		if (persona.getUsuario().getRol() == null)
			persona.getUsuario().setRol( new Rol());
		persona.getUsuario().getRol()
				.setId((Long) request.getSession().getAttribute("rol"));
		registerPersonstService.actualizarUsuario(persona, request);
		return new ModelAndView("usuario_registrado");
	}

}
